package org.ccay.core.session;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;

/**
 * Session顶层抽象
 *
 */
public interface Session extends Serializable {

    /**
     * 返回session ID
     * @return session ID
     */
    Serializable getId();

    /**
     * 返回session创建时间
     * @return session创建时间
     */
    Date getStartTimestamp();

    /**
     * 返回session最后访问时间
     * @return session最后访问时间
     */
    Date getLastAccessTime();

    /**
     * 返回session距过期时间的毫秒数 如果当前session已经过期，则返回-1
     * @return 返回session距过期时间的毫秒数 如果当前session已经过期，则返回-1
     */
    long getTimeout() ;

    /**
     * 重新设置session距过期时间的毫秒数，如果当前session已经过期此函数什么都不做
     */
    void setTimeout(long maxIdleTimeInMillis);

    /**
     * 返回IP地址
     * @return IP地址
     */
    String getHost();

    /**
     * 刷行session访问。如果session失效，则什么都不做。
     */
    void touch();

    /**
     * 停用Session。如果session失效，则什么都不做。
     */
    void stop();
    
    /**
     *  获取session的所有属性，如果session失效，则返回空的集合。
     * @return 获取session的所有属性，如果session失效，则返回空的集合。
     */
    Collection<Object> getAttributeKeys();

    /**
     * 获取给定属性标识的属性值，如果session失效，则返回null.
     * @param key 属性标识
     * @return 获取session的所有属值，如果session失效，则返回null.
     */
    Object getAttribute(Object key);

    /**
     * 设置属性值 如果session失效，则什么都不做。
     * @param key 属性标识
     * @param value 属性值
     */
    void setAttribute(Object key, Object value);

    /**
     * 删除属性值 
     * @param key 属性标识
     * @return 被删除的属性值，如果当前seesion失效，或给定的属性标识未绑定到当前session则返回null.
     */
    Object removeAttribute(Object key) ;
}
